const axios = require('axios');
const fs = require('fs');

// 测试配置
const BASE_URL = 'http://localhost:3000';
const TEST_DATA = {
    area_id: 7, // 重庆市育才中学
    location: '测试教室101',
    person: '张三',
    repair_date: '2024-01-15',
    items: JSON.stringify([
        { id: 1, name: '补加氟材料费及技术服务费', specification: '1P-1.5P挂机', unit: '次', price: 80, quantity: 1 },
        { id: 2, name: '更换压机电容材料费及技术服务费', specification: '2P柜、挂机', unit: '台', price: 50, quantity: 2 }
    ])
};

/**
 * 测试用户端数据提交功能
 */
async function testUserSubmission() {
    console.log('\n=== 测试用户端数据提交功能 ===');
    
    try {
        // 1. 测试获取区域列表
        console.log('1. 测试获取区域列表...');
        const areasResponse = await axios.get(`${BASE_URL}/api/areas`);
        console.log(`✓ 获取到 ${areasResponse.data.length} 个区域`);
        
        // 2. 测试获取维修项目列表
        console.log('2. 测试获取维修项目列表...');
        const itemsResponse = await axios.get(`${BASE_URL}/api/repair-items/${TEST_DATA.area_id}`);
        console.log(`✓ 获取到 ${itemsResponse.data.length} 个维修项目`);
        
        // 3. 测试提交计价单
        console.log('3. 测试提交计价单...');
        const submitResponse = await axios.post(`${BASE_URL}/api/quotations`, TEST_DATA);
        console.log(`✓ 计价单提交成功，ID: ${submitResponse.data.id}`);
        
        return submitResponse.data.id;
        
    } catch (error) {
        console.error('✗ 用户端测试失败:', error.response?.data || error.message);
        return null;
    }
}

/**
 * 测试管理端数据查看功能
 */
async function testAdminView() {
    console.log('\n=== 测试管理端数据查看功能 ===');
    
    try {
        // 1. 测试获取所有计价单
        console.log('1. 测试获取所有计价单...');
        const quotationsResponse = await axios.get(`${BASE_URL}/api/admin/quotations`);
        console.log(`✓ 获取到 ${quotationsResponse.data.length} 个计价单`);
        
        // 2. 测试获取所有区域
        console.log('2. 测试获取所有区域...');
        const areasResponse = await axios.get(`${BASE_URL}/api/admin/areas`);
        console.log(`✓ 获取到 ${areasResponse.data.length} 个区域`);
        
        // 3. 测试获取所有维修项目
        console.log('3. 测试获取所有维修项目...');
        const itemsResponse = await axios.get(`${BASE_URL}/api/admin/repair-items`);
        console.log(`✓ 获取到 ${itemsResponse.data.length} 个维修项目`);
        
        return quotationsResponse.data;
        
    } catch (error) {
        console.error('✗ 管理端查看测试失败:', error.response?.data || error.message);
        return [];
    }
}

/**
 * 测试管理端增删改查功能
 */
async function testAdminCRUD(quotationId) {
    console.log('\n=== 测试管理端增删改查功能 ===');
    
    try {
        // 1. 测试添加新区域
        console.log('1. 测试添加新区域...');
        const newAreaData = { name: '测试区域_' + Date.now() };
        const addAreaResponse = await axios.post(`${BASE_URL}/api/admin/areas`, newAreaData);
        console.log(`✓ 新区域添加成功，ID: ${addAreaResponse.data.id}`);
        const newAreaId = addAreaResponse.data.id;
        
        // 2. 测试添加新维修项目
        console.log('2. 测试添加新维修项目...');
        const newItemData = {
            area_id: newAreaId,
            name: '测试维修项目',
            specification: '测试规格',
            unit: '个',
            price: 100,
            remark: '测试备注'
        };
        const addItemResponse = await axios.post(`${BASE_URL}/api/admin/repair-items`, newItemData);
        console.log(`✓ 新维修项目添加成功，ID: ${addItemResponse.data.id}`);
        const newItemId = addItemResponse.data.id;
        
        // 3. 测试更新维修项目
        console.log('3. 测试更新维修项目...');
        const updateItemData = {
            name: '更新后的测试维修项目',
            specification: '更新后的规格',
            unit: '台',
            price: 150,
            remark: '更新后的备注'
        };
        await axios.put(`${BASE_URL}/api/admin/repair-items/${newItemId}`, updateItemData);
        console.log('✓ 维修项目更新成功');
        
        // 4. 测试删除维修项目
        console.log('4. 测试删除维修项目...');
        await axios.delete(`${BASE_URL}/api/admin/repair-items/${newItemId}`);
        console.log('✓ 维修项目删除成功');
        
        // 5. 测试删除区域
        console.log('5. 测试删除区域...');
        await axios.delete(`${BASE_URL}/api/admin/areas/${newAreaId}`);
        console.log('✓ 区域删除成功');
        
        // 6. 测试删除计价单（如果有的话）
        if (quotationId) {
            console.log('6. 测试删除计价单...');
            await axios.delete(`${BASE_URL}/api/admin/quotations/${quotationId}`);
            console.log('✓ 计价单删除成功');
        }
        
    } catch (error) {
        console.error('✗ 管理端增删改查测试失败:', error.response?.data || error.message);
    }
}

/**
 * 测试数据导出功能
 */
async function testDataExport() {
    console.log('\n=== 测试数据导出功能 ===');
    
    try {
        // 测试导出计价单
        console.log('1. 测试导出计价单...');
        const exportResponse = await axios.get(`${BASE_URL}/api/admin/export/quotations`, {
            responseType: 'stream'
        });
        
        const writer = fs.createWriteStream('./test_export.xlsx');
        exportResponse.data.pipe(writer);
        
        await new Promise((resolve, reject) => {
            writer.on('finish', resolve);
            writer.on('error', reject);
        });
        
        console.log('✓ 计价单导出成功，文件保存为 test_export.xlsx');
        
    } catch (error) {
        console.error('✗ 数据导出测试失败:', error.response?.data || error.message);
    }
}

/**
 * 主测试函数
 */
async function runTests() {
    console.log('开始系统功能测试...');
    console.log('测试服务器地址:', BASE_URL);
    
    // 检查服务器是否运行
    try {
        await axios.get(BASE_URL);
        console.log('✓ 服务器运行正常');
    } catch (error) {
        console.error('✗ 服务器未运行，请先启动服务器');
        return;
    }
    
    // 执行各项测试
    const quotationId = await testUserSubmission();
    const quotations = await testAdminView();
    await testAdminCRUD(quotationId);
    await testDataExport();
    
    console.log('\n=== 测试完成 ===');
    console.log('所有功能测试已完成，请检查上述输出结果。');
}

// 执行测试
runTests().catch(error => {
    console.error('测试执行失败:', error);
    process.exit(1);
});